<!doctype html><html lang=cn-zh><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta http-equiv=X-UA-Compatible content="IE=edge"><style type=text/css>body{font-family:monospace}</style><title>macOXS中使用matplotlib遇到的问题及探究</title>
<meta name=description content="A blog maintained by Vimiix."><link rel=stylesheet href=/css/style.css><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?7c24231917964240bae97e813810620c",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script></head><body><header>====================<br>== Hi, I'm Vimiix ==<br>====================<div style=float:right;color:gray;font-size:x-large>Get hands dirty.</div><br><p><nav><a href=https://www.vimiix.com/><b>首页</b></a>.
<a href=/posts/><b>文章列表</b></a>.
<a href=/projects/><b>开源项目</b></a>.
<a href=/tags/><b>标签</b></a>.
<a href=/friends/><b>友链</b></a>.
<a href=/about/><b>关于我</b></a>.
<a href=/index.xml><b>RSS</b></a>.</nav></p></header><main><article><h1>macOXS中使用matplotlib遇到的问题及探究</h1><b><time>2018.10.16 11:22</time></b>
<a href=/tags/python>Python</a>
<a href=/tags/note>note</a>
<a href=/tags/matplotlib>matplotlib</a>
<a href=/tags/solution>solution</a><div><p>第一次在 mac 系统上使用<strong>matplotlib</strong>库的时候，在执行的时候，往往会遇到下面这样的问题：</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>ImportError: Python is not installed as a framework. balabala....
</span></span></code></pre></div><h3 id=解决方案>解决方案</h3><p>当然这个问题很好解决，网上有一搜就会找到如下两种解决方案：</p><h4 id=第一种方案是在系统中设置>第一种方案是在系统中设置</h4><ul><li>假设你已经通过<code>pip install matplotlib</code>安装了 matplotlib，那么在你的根目录中会有一个名为<code>〜/ .matplotlib</code>的目录。</li><li>在这个目录中创建一个<code>matplotlibrc</code>的文件 ,在里面添加一行代码：<code>backend: TkAgg</code>，保存退出即可。</li></ul><p>总结为一行 shell 命令就是：<code>echo "backend: TkAgg" >> ~/.matplotlib/matplotlibrc</code></p><p>这种方式可以设定整个系统的 matplotlib 渲染使用的引擎，但是不好的是，代码会变得不可移植，如果服务器很多，我们需要每一台机器都去设置这个参数，这时候就需要使用第二种方案。</p><h4 id=第二种方案是在代码中设置>第二种方案是在代码中设置</h4><p>在引用<code>matplotlib</code>库的代码之前，添加如下两行代码（确认安装 TkInter）：</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span><span style=color:#f92672>import</span> matplotlib
</span></span><span style=display:flex><span>matplotlib<span style=color:#f92672>.</span>use(<span style=color:#e6db74>&#39;TkAgg&#39;</span>)
</span></span></code></pre></div><p>这样也可以临时的修改前面提到的 <code>backend</code>变量。</p><h3 id=为什么要这样做>为什么要这样做？</h3><p>从两种解决方法基本可以看出，两种方法都是通过修改一个叫做 <code>backend</code>的值来解决的。但这个<code>TKAgg</code>是什么鬼呢？</p><p>回答这个问题就需要知道为什么会默认的情况会产生上面的那个 <code>ImportError</code>。出现这个错误的原因是，在 mac os 系统镜像中渲染 matplotlib 的后端，默认情况下使用的是<strong>Cocoa</strong>的 API 来渲染。其实还有 <strong>Qt4Agg</strong> ， <strong>GTKAgg</strong> ， <strong>TkAgg</strong>等很多可以使用。这是 macosx 与其他 windows 或 linux os 相比不同的地方。</p><h3 id=什么是backend>什么是<code>backend</code>？</h3><p>网上有很多的文档或解决方案都会提到<code>backend</code>，但许多用户对此术语会感到困惑（比如我）。matplotlib 会面对许多不同的用法和输出形式。比如，有人会在 python shell 交互使用 matplotlib，并在键入命令时弹出绘图窗口。有人将 matplotlib 嵌入到图形用户界面（<em>如 wxpython 或 pygtk</em>）中以构建丰富的应用程序。还有人在批处理脚本中使用 matplotlib 从一些数值模拟生成<a href=https://zh.wikipedia.org/wiki/PostScript>postscript 图像</a>，还有一些是在 Web 应用程序服务器中生成 posts 动画以提供动态图形。</p><p>为了支持所有这些用法，matplotlib 可以提供不同的输出，这些输出中都称为<code>backend</code>; <code>“frontend”</code>是面向用户的代码，即绘图代码，而<code>backend</code>完成幕后的所有生成图形的复杂工作。</p><p>matplotlib 中有两种类型的<code>backend</code>：</p><ul><li>用户界面后端（用于 pygtk，wxpython，tkinter，qt4 或 macosx 等，也被称为“交互式后端”）</li><li>硬拷贝后端（用于制作图像文件 PNG，SVG，PDF，PS 等，也被称为“非交互式后端”）</li></ul><p>设置<code>backend</code>的方法其实不止有网上提到两种方案，一共有四种方法。如果它们彼此有冲突，将使用以下列表中最后提到的方法，例如，调用<code>use()</code>则将会覆盖<strong>matplotlibrc</strong>中的设置。</p><ol><li><p><strong>matplotlibrc</strong>文件中的<code>backend</code>参数，也就是我们上面说的方案一：</p><p>（如果想定制化 matplotlib 其他的参数，<a href=https://matplotlib.org/users/customizing.html#customizing-matplotlib>点击查看</a>）：</p></li></ol><pre tabindex=0><code>backend : TkAgg   # Agg(antigrain) 渲染到 Tk canvas (需要安装TkInter)
</code></pre><ol start=2><li>为当前 shell 或单个脚本设置<code>MPLBACKEND</code>环境变量：</li></ol><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>&gt; export MPLBACKEND<span style=color:#f92672>=</span><span style=color:#e6db74>&#34;module://my_backend&#34;</span>
</span></span><span style=display:flex><span>&gt; python simple_plot.py
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>&gt; MPLBACKEND<span style=color:#f92672>=</span><span style=color:#e6db74>&#34;module://my_backend&#34;</span> python simple_plot.py
</span></span></code></pre></div><p>设置此环境变量将覆盖 matplotlibrc 中的 backend 参数值，即使当前工作目录中存在 matplotlibrc 也是如此。因此，<strong>不鼓励</strong>在全局设置<code>MPLBACKEND</code>，例如在<code>.bashrc</code>或<code>.profile</code>中，因为它会让我们很难发现问题。</p><ol start=3><li>要为单个脚本设置 backend，也可以使用 <code>-d</code> 命令行参数：</li></ol><pre tabindex=0><code>&gt; python script.py -dbackend
</code></pre><p>不推荐使用此方法，因为<code>-d</code>参数可能与解析命令行参数的脚本冲突（参考<a href=https://github.com/matplotlib/matplotlib/issues/1986>issue＃1986</a>）。</p><ol start=4><li>如果你的脚本依赖于特定的后端，则可以使用<code>use()</code>函数：</li></ol><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span><span style=color:#f92672>import</span> matplotlib
</span></span><span style=display:flex><span>matplotlib<span style=color:#f92672>.</span>use(<span style=color:#e6db74>&#39;PS&#39;</span>)   <span style=color:#75715e># 默认输出 postscript</span>
</span></span></code></pre></div><p>如果要使用<code>use()</code>函数，则必须在导入<code>matplotlib.pyplot</code>之前调用。导入 pyplot 后调用<code>use()</code>将不起作用。如果想要使用不同的后端，则不得不对源码做编辑，修改<code>use()</code>中的代码来完成。因此，除非必要，否则应该避免显式调用<code>use()</code>。</p><blockquote><p><code>backend</code>名称规范不区分大小写;例如，&lsquo;GTKAgg&rsquo;和&rsquo;gtkagg&rsquo;是等价的。</p></blockquote><h3 id=backend选择列表><code>backend</code>选择列表</h3><h4 id=交互式列表>交互式列表</h4><p>这些是支持的用户界面和渲染器组合，能够显示到屏幕并使用非交互式列表中的适当渲染器写入文件：</p><table><thead><tr><th>Backend</th><th>Description</th></tr></thead><tbody><tr><td>GTKAgg</td><td>Agg rendering to a <a href=https://matplotlib.org/glossary/index.html#term-gtk>GTK</a> 2.x canvas (requires <a href=http://www.pygtk.org/>PyGTK</a> and <a href=https://www.cairographics.org/pycairo/>pycairo</a> or <a href=https://pythonhosted.org/cairocffi/>cairocffi</a>; Python2 only)</td></tr><tr><td>GTK3Agg</td><td>Agg rendering to a <a href=https://matplotlib.org/glossary/index.html#term-gtk>GTK</a> 3.x canvas (requires <a href=https://wiki.gnome.org/action/show/Projects/PyGObject>PyGObject</a> and <a href=https://www.cairographics.org/pycairo/>pycairo</a> or <a href=https://pythonhosted.org/cairocffi/>cairocffi</a>)</td></tr><tr><td>GTK</td><td>GDK rendering to a <a href=https://matplotlib.org/glossary/index.html#term-gtk>GTK</a> 2.x canvas (not recommended and d eprecated in 2.0) (requires <a href=http://www.pygtk.org/>PyGTK</a> and <a href=https://www.cairographics.org/pycairo/>pycairo</a> or <a href=https://pythonhosted.org/cairocffi/>cairocffi</a>; Python2 only)</td></tr><tr><td>GTKCairo</td><td>Cairo rendering to a <a href=https://matplotlib.org/glossary/index.html#term-gtk>GTK</a> 2.x canvas (requires <a href=http://www.pygtk.org/>PyGTK</a> and <a href=https://www.cairographics.org/pycairo/>pycairo</a> or <a href=https://pythonhosted.org/cairocffi/>cairocffi</a>; Python2 only)</td></tr><tr><td>GTK3Cairo</td><td>Cairo rendering to a <a href=https://matplotlib.org/glossary/index.html#term-gtk>GTK</a> 3.x canvas (requires <a href=https://wiki.gnome.org/action/show/Projects/PyGObject>PyGObject</a> and <a href=https://www.cairographics.org/pycairo/>pycairo</a> or <a href=https://pythonhosted.org/cairocffi/>cairocffi</a>)</td></tr><tr><td>WXAgg</td><td>Agg rendering to to a <a href=https://matplotlib.org/glossary/index.html#term-wxwidgets>wxWidgets</a> canvas (requires <a href=https://www.wxpython.org/>wxPython</a>)</td></tr><tr><td>WX</td><td>Native <a href=https://matplotlib.org/glossary/index.html#term-wxwidgets>wxWidgets</a> drawing to a <a href=https://matplotlib.org/glossary/index.html#term-wxwidgets>wxWidgets</a> Canvas (not recommended and deprecated in 2.0) (requires <a href=https://www.wxpython.org/>wxPython</a>)</td></tr><tr><td>TkAgg</td><td>Agg rendering to a <a href=https://matplotlib.org/glossary/index.html#term-tk>Tk</a> canvas (requires <a href=https://wiki.python.org/moin/TkInter>TkInter</a>)</td></tr><tr><td>Qt4Agg</td><td>Agg rendering to a <a href=https://matplotlib.org/glossary/index.html#term-qt4>Qt4</a> canvas (requires <a href=https://riverbankcomputing.com/software/pyqt/intro>PyQt4</a> or <code>pyside</code>)</td></tr><tr><td>Qt5Agg</td><td>Agg rendering in a <a href=https://matplotlib.org/glossary/index.html#term-qt5>Qt5</a> canvas (requires <a href=https://riverbankcomputing.com/software/pyqt/intro>PyQt5</a>)</td></tr><tr><td>macosx</td><td>Cocoa rendering in OSX windows (presently lacks blocking show() behavior when matplotlib is in non-interactive mode)</td></tr></tbody></table><h4 id=非交互式列表>非交互式列表</h4><p>以下是 matplotlib 渲染器的列表（每个渲染器都有一个同名支持，能够写入文件）：</p><table><thead><tr><th>Renderer</th><th>Filetypes</th><th>Description</th></tr></thead><tbody><tr><td><a href=https://matplotlib.org/glossary/index.html#term-agg>AGG</a></td><td><a href=https://matplotlib.org/glossary/index.html#term-png>png</a></td><td><a href=https://matplotlib.org/glossary/index.html#term-raster-graphics>raster graphics</a> – high quality images using the <a href=http://antigrain.com/>Anti-Grain Geometry</a> engine</td></tr><tr><td>PS</td><td><a href=https://matplotlib.org/glossary/index.html#term-ps>ps</a> <a href=https://matplotlib.org/glossary/index.html#term-eps>eps</a></td><td><a href=https://matplotlib.org/glossary/index.html#term-vector-graphics>vector graphics</a> – <a href=https://en.wikipedia.org/wiki/PostScript>Postscript</a> output</td></tr><tr><td>PDF</td><td><a href=https://matplotlib.org/glossary/index.html#term-pdf>pdf</a></td><td><a href=https://matplotlib.org/glossary/index.html#term-vector-graphics>vector graphics</a> – <a href=https://en.wikipedia.org/wiki/Portable_Document_Format>Portable Document Format</a></td></tr><tr><td>SVG</td><td><a href=https://matplotlib.org/glossary/index.html#term-svg>svg</a></td><td><a href=https://matplotlib.org/glossary/index.html#term-vector-graphics>vector graphics</a> – <a href=https://en.wikipedia.org/wiki/Scalable_Vector_Graphics>Scalable Vector Graphics</a></td></tr><tr><td><a href=https://matplotlib.org/glossary/index.html#term-cairo>Cairo</a></td><td><a href=https://matplotlib.org/glossary/index.html#term-png>png</a> <a href=https://matplotlib.org/glossary/index.html#term-ps>ps</a> <a href=https://matplotlib.org/glossary/index.html#term-pdf>pdf</a> <a href=https://matplotlib.org/glossary/index.html#term-svg>svg</a> &mldr;</td><td><a href=https://matplotlib.org/glossary/index.html#term-vector-graphics>vector graphics</a> – <a href=https://en.wikipedia.org/wiki/Cairo_(graphics)>Cairo graphics</a></td></tr><tr><td><a href=https://matplotlib.org/glossary/index.html#term-gdk>GDK</a></td><td><a href=https://matplotlib.org/glossary/index.html#term-png>png</a> <a href=https://matplotlib.org/glossary/index.html#term-jpg>jpg</a> <a href=https://matplotlib.org/glossary/index.html#term-tiff>tiff</a> &mldr;</td><td><a href=https://matplotlib.org/glossary/index.html#term-raster-graphics>raster graphics</a> – the <a href=https://en.wikipedia.org/wiki/GDK>Gimp Drawing Kit</a> Deprecated in 2.0</td></tr></tbody></table><h3 id=参考链接>参考链接</h3><ul><li><a href=https://stackoverflow.com/questions/21784641/installation-issue-with-matplotlib-python>https://stackoverflow.com/questions/21784641/installation-issue-with-matplotlib-python</a></li><li><a href=https://matplotlib.org/faq/usage_faq.html#what-is-a-backend>https://matplotlib.org/faq/usage_faq.html#what-is-a-backend</a></li><li><a href=https://matplotlib.org/users/customizing.html#customizing-matplotlib>https://matplotlib.org/users/customizing.html#customizing-matplotlib</a></li></ul><p>&mdash; EOF &mdash;</p></div></article></main><aside><div><div><h3>LATEST POSTS</h3></div><div><ul><li><a href=/posts/2025-10-16-kubernetes-apiserver-authorization-mechanism/>Kubernetes APIServer 鉴权机制</a></li><li><a href=/posts/2025-09-30-kubernetes-apiserver-authentication-mechanism/>Kubernetes APIServer 认证机制</a></li><li><a href=/posts/2024-12-16-deploy-kubernetes-by-kubeadm/>使用 kubeadm 搭建 kubernetes 集群</a></li><li><a href=/posts/2024-09-20-how-to-code-review/>如何做code review</a></li><li><a href=/posts/2024-08-12-weakref-in-python/>Python中的弱引用</a></li></ul></div></div></aside><footer><p>Social Links:
<a href=https://github.com/vimiix><b>Github</b></a>.
<a href=https://www.douban.com/people/vimiix/><b>Douban</b></a>.
<a href=mailto:i@vimiix.com><b>Email</b></a>.<br><hr>&copy; 2017-2025
Vimiix Yao; All rights reserved.
<a href=https://beian.miit.gov.cn/>京ICP备19015214号-1</a></p><script src=https://l2dwidget.js.org/lib/L2Dwidget.min.js></script><script>L2Dwidget.init({model:{jsonPath:"https://unpkg.com/live2d-widget-model-tororo@1.0.5/assets/tororo.model.json"}})</script></footer></body></html>